/*
  车厢调度
  题目描述
    有一个火车站，铁路如图所示，每辆火车从 A 驶入，再从 B 方向驶出，同时它的车厢可以重新组合。
    假设从 A 方向驶来的火车有 n 节（n ≤ 1000），分别按照顺序编号为 1，2，3，…，n。
    假定在进入车站前，每节车厢之间都不是连着的，并且它们可以自行移动到B处的铁轨上。
    另外假定车站 C 可以停放任意多节车厢。但是一旦进入车站 C，它就不能再回到 A 方向的铁轨上了，
    并且一旦当它进入 B 方向的铁轨，它就不能再回到车站 C。

           5 4 3 2 1        1 2 3 4 5
           __________      ___________
      B    ________  \    /  _________     A
                   \  \  /  /
                    \  \/  /
                     \ /\ /
                      |  |
                      |  |
                      |  |  C
                      |  |

    负责车厢调度的工作人员需要知道能否使它以 a1, a2, …, an 的顺序从 B 方向驶出，请来判断能否得到指定的车厢顺序。
  输入
    第一行为一个整数 n，其中 n ≤ 1000，表示有 n 节车厢，第二行为 n 个数字，表示指定的车厢顺序。
  输出
    如果可以得到指定的车厢顺序，则输出一个字符串 ”YES”，否则输出 ”NO”（注意要大写，不包含引号）。
  样例输入
    5
    5 4 3 2 1
  样例输出
    YES
*/

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    int x = 1;
    int a[1005];  // a[1] ~ a[n]: 表示指定的车厢顺序(出栈的顺序), a[1] 表示第一个出栈的车厢编号

    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    int a1[1005] = {}; // a1[1] ~ a1[n]: 表示车厢的状态. 0 -- 未进栈, 1 -- 已进栈，2 -- 已出栈
    stack <int> sta;
    for (int i = 1; i <= n; i++) {
        /*
          使 a[i] 对应的车厢 进栈
          注意: a[i] 对应的车厢能进栈的前提是:  编号为小于 a[i] 的车厢的状态为 "已进栈" 或者 "已出栈"
                如果该条件不满足, 则让对应的车厢进栈!
        */
        for (int j = 1; j <= a[i]; j++) {
            if (a1[j] == 0) {
                sta.push(j);
                a1[j] = 1;     // 标记 a1[j] 对应的车厢状态为 "已进栈"
            }
        }
        if (!sta.empty()) {
            if (sta.top() != a[i]) { // 如果栈顶代表的车厢号 和 期望的不符, 则说明不可能得到这种出栈数序。
                cout << "NO";
                return 0;
            } else {
                a1[a[i]] = 2;  // 标记 a1[j] 对应的车厢状态为 "已出栈"
                sta.pop();
            }
        }
    }
    cout << "YES";

    return 0;
}